library("FactoMineR")
library("corrplot")
library("ggcorrplot")
library("corrr")
library("rattle")
library("fmsb")
library("ggmap")
library("mapproj")
library("factoextra")
1. [20 puntos] Se le pidió a un grupo de 100 clientes que compraron el mismo producto o productos similares en la tienda de AMAZON, que evaluaran el servicio recibido desde diferentes aspectos. El archivo EjemploAlgoritmosRecomendacion.csv muestra los promedios de la evaluación dada por los clientes en relación a las variables que se pueden apreciar en el encabezado de la tabla. Para este dataset, realice lo siguiente:
a) Cargue el dataset EjemploAlgoritmosRecomendacion.csv, verifique que la lectura de los datos es correcta.
clientes <- read.csv("EjemploAlgoritmosRecomendacion.csv", sep = ";", dec = ",", header = T,row.names = 1)
head(clientes)
Velocidad.Entrega Precio Durabilidad Imagen.Producto Valor.Educativo Servicio.Retorno Tamano.Paquete
Adam 2.05 0.30 3.45 2.35 2.4 2.3 2.60
Anna 0.90 1.50 3.15 3.30 2.5 4.0 4.20
Bernard 1.70 2.60 2.85 3.00 4.3 2.7 4.10
Edward 1.35 0.50 3.55 2.95 1.8 2.3 3.90
Emilia 3.00 0.45 4.80 3.90 3.4 4.6 2.25
Fabian 0.95 1.65 3.95 2.40 2.6 1.9 4.85
Calidad.Producto Numero.Estrellas
Adam 2.10 1.7
Anna 2.15 2.8
Bernard 2.60 3.3
Edward 1.95 1.7
Emilia 3.40 4.3
Fabian 2.20 3.0
b) A manera de diagnóstico, haga una inspección de los datos presentes en el dataset y describa las variables presentes, tipos de variables, si hay datos nulos.
# summary(clientes)
paste("Valores nulos para la variable Velocidad.Entrega:", sum(is.na(clientes$Velocidad.Entrega)))
paste("Valores nulos para la variable Precio:", sum(is.na(clientes$Precio)))
paste("Valores nulos para la variable Durabilidad:", sum(is.na(clientes$Durabilidad)))
paste("Valores nulos para la variable Imagen.Producto:", sum(is.na(clientes$Imagen.Producto)))
paste("Valores nulos para la variable Valor.Educativo:", sum(is.na(clientes$Valor.Educativo)))
paste("Valores nulos para la variable Servicio.Retorno:", sum(is.na(clientes$Servicio.Retorno)))
paste("Valores nulos para la variable Tamano.Paquete:", sum(is.na(clientes$Tamano.Paquete)))
paste("Valores nulos para la variable Calidad.Producto:", sum(is.na(clientes$Calidad.Producto)))
paste("Valores nulos para la variable Numero.Estrellas:", sum(is.na(clientes$Numero.Estrellas)))
En el dataset clientes podemos encontrar las siguientes variables:
   - Velocidad de Entrega
   - Precio
   - Durabilidad
   - Imagen del producto
   - Valor Educativo
   - Servicio de Retorno
   - Tamaño del paquete
   - Calidad del Producto
   - Número de estrellas.
Las cuales corresponden a valores númericos asignados por los clientes en orden de evaluar los productos comprados en AMAZON.
Todas estas variable son de tipo cuantitativo lo que significa que representan valores númericos y admiten operaciones matemáticas sobre ellas. A estas variables cuantitativas las podemos clasificar como continuas, es decir, pueden tomar cualquier valor en un intervalo dado.
Se aplicó la función is.na() sobre las columnas del dataset y no se encontrar datos nulos en el dataset clientes.
c) Determine si existen correlaciones importantes entre las variables del dataset, utilizando alguno de los gráficos o la matriz de correlaciones vistos en clases (si desea, puede usar otra herramienta de su preferencia). Recordemos que para aplicar un ACP, es importante que existan correlaciones entre las variables.
A continuación se muestran las correlaciones numericas para el dataset clientes:
# Para ver las correlaciones numéricas
correlaciones_numericas <- round(cor(clientes), 2)
correlaciones_numericas
Velocidad.Entrega Precio Durabilidad Imagen.Producto Valor.Educativo Servicio.Retorno Tamano.Paquete
Velocidad.Entrega 1.00 -0.35 0.51 0.05 0.61 0.08 -0.48
Precio -0.35 1.00 -0.49 0.27 0.51 0.19 0.47
Durabilidad 0.51 -0.49 1.00 -0.12 0.07 -0.03 -0.45
Imagen.Producto 0.05 0.27 -0.12 1.00 0.30 0.79 0.20
Valor.Educativo 0.61 0.51 0.07 0.30 1.00 0.24 -0.06
Servicio.Retorno 0.08 0.19 -0.03 0.79 0.24 1.00 0.18
Tamano.Paquete -0.48 0.47 -0.45 0.20 -0.06 0.18 1.00
Calidad.Producto 0.65 0.03 0.52 0.48 0.63 0.34 -0.28
Numero.Estrellas 0.68 0.08 0.56 0.22 0.70 0.26 -0.19
Calidad.Producto Numero.Estrellas
Velocidad.Entrega 0.65 0.68
Precio 0.03 0.08
Durabilidad 0.52 0.56
Imagen.Producto 0.48 0.22
Valor.Educativo 0.63 0.70
Servicio.Retorno 0.34 0.26
Tamano.Paquete -0.28 -0.19
Calidad.Producto 1.00 0.71
Numero.Estrellas 0.71 1.00
corrplot(correlaciones_numericas)
ggcorrplot(correlaciones_numericas)
Las correlaciones positivas más fuertes que se observan son:
   - Imagen del producto con Servicio de Retorno
   - Número de estrellas con valor educativo
   - Número de estrellas con velocidad de entrega
   - Velocidad de entrega con calidad del producto
Las correlaciones negativas más fuertes que se observan son:
   - Precio con durabilidad
   - Tamaño del paquete con velocidad de entrega
   - Tamaño del paquete con durabilidad
d) Realice un ACP usando el paquete FactoMiner, creando el plano principal y el cÃrculo de correlaciones. Superponga ambos gráficos e identifique la cantidad de clústeres que considere apropiado. Haga un análisis descriptivo de cada clúster, indique si hay variables correlacionadas y el tipo de correlación entre estas.
pca_clientes <- PCA(clientes, scale.unit=TRUE, ncp=5, graph = FALSE)
plot(pca_clientes, axes=c(1, 2), choix="ind", col.ind="purple",new.plot=TRUE)
plot(pca_clientes, axes=c(1, 2), choix="var", col.var="blue",new.plot=TRUE)
fviz_pca_biplot(pca_clientes, repel = FALSE,
col.var = "#fc078a", # Variables color
col.ind = "#696969" # Individuals color
)
Superponga ambos gráficos e identifique la cantidad de clústeres que considere apropiado. Haga un análisis descriptivo de cada clúster, indique si hay variables correlacionadas y el tipo de correlación entre estas.
Se pueden observar 2 clústeres en el análisis del PCA.
Clúster 01:
Clúster 02:
e) Repita el ejercicio anterior usando el paquete FactoMineR, elimine de los gráficos los individuos con \(cos^{2} (\theta)\) \(\le 0.2\) y las variables \(cos^{2} (\theta)\) \(\le 0.55\) y vuelva a crear el plano principal y el cÃrculo de correlaciones. ¿Cuáles individuos quedaron mal representados?, ¿cuáles variables quedaron mal representadas?
Sugerencia: Puede usar el código del documento o cualquiera de su preferencia:
¿Cuáles individuos quedaron mal representados?
# El coseno cuadrado se calcula sumando los valores de las dos dimensiones por individuo o por variable (puede revisar la presentación, en las diapositivas finales se explica como se calcula este dato
# Se parte del hecho de que ya se tiene el modelo de ACP, que hemos llamado para efectos del ejemplo pca_clientes, de ahà se extrae los cosenos cuadrados de los individuos. Para el caso de las variables, debe cambiar la instrucción pca_datos$ind$cos2 por pca_clientes$var$cos2
cos2.ind<-(pca_clientes$ind$cos2[,1] + pca_clientes$ind$cos2[,2])
individuos_malrepresentados <- NULL
for (i in 1 : nrow(clientes)) {
ifelse(cos2.ind [i] <= 0.2, individuos_malrepresentados <- rbind(individuos_malrepresentados, i), NA)
}
cos2.ind[individuos_malrepresentados]
Henry Isabelle Sebastian
0.11569585 0.01262467 0.16038875
#plot(pca_clientes, axes=c(1, 2), choix="ind", col.ind="red",new.plot=TRUE, select="cos2 0.2")
#res.pca <- prcomp(clientes, scale = TRUE)
fviz_pca_ind(pca_clientes,
col.ind = "cos2", # Color by the quality of representation
gradient.cols = c("#00AFBB", "#E7B800", "#fc078a"),
repel = FALSE # Avoid text overlapping
)
Los individuos que están mal representados son:
   - Henry
   - Isabelle
   - Sebastian
Ya que si calculamos el coseno cuadrado de sus coeficientes de relación todos los resultados son menores a 0.2
¿Cuáles variables quedaron mal representadas?
cos2.var<-(pca_clientes$var$cos2[,1] + pca_clientes$var$cos2[,2])
variables_malrepresentadas <- NULL
for (i in 1 : ncol(clientes)) {
header <- names(cos2.var[i])[1]
value <- cos2.ind[i]
ifelse(value <= 0.55, variables_malrepresentadas <- cbind(matrix(c(header, value), 2, 1, TRUE), variables_malrepresentadas), NA)
}
variables_malrepresentadas
[,1]
[1,] "Servicio.Retorno"
[2,] "0.454086771119677"
# plot(pca_clientes, axes=c(1, 2), choix="var", col.var="blue",new.plot=TRUE, select="cos2 0.55")
fviz_pca_var(pca_clientes,
col.var = "cos2", # Color by contributions to the PC
gradient.cols = c("#00AFBB", "#E7B800", "#fc078a"),
repel = TRUE # Avoid text overlapping
)
La única variable mal representada en los datos anteriores es Servicio.Retorno ya que el cálculo de el coseno cuadrado de su coeficiente de relación es menor a 0.55, como se puede observar en el gráfico anterior.
f) Realice un gráfico radar (araña) usando 3 clústeres e interprete cada uno de los clústeres.
modelo <- hclust(dist(clientes),method= "ward")
The "ward" method has been renamed to "ward.D"; note new "ward.D2"
centros<-centers.hclust(clientes,modelo,nclust=3,use.median=FALSE)
centros
Velocidad.Entrega Precio Durabilidad Imagen.Producto Valor.Educativo Servicio.Retorno Tamano.Paquete
[1,] 1.262791 1.1511628 3.503488 2.496512 2.358140 2.516279 3.748837
[2,] 1.700000 1.7090909 3.843182 3.006818 3.390909 3.040909 3.979545
[3,] 2.401429 0.8885714 4.557143 2.540000 3.302857 2.611429 2.851429
Calidad.Producto Numero.Estrellas
[1,] 2.019767 2.288372
[2,] 2.590909 3.472727
[3,] 2.705714 3.891429
rownames(centros)<-c("Cluster 1","Cluster 2","Cluster 3")
centros<-as.data.frame(centros)
maximos<-apply(centros,2,max)
minimos<-apply(centros,2,min)
centros<-rbind(minimos,centros)
centros<-rbind(maximos,centros)
centros
Velocidad.Entrega Precio Durabilidad Imagen.Producto Valor.Educativo Servicio.Retorno Tamano.Paquete
1 2.401429 1.7090909 4.557143 3.006818 3.390909 3.040909 3.979545
11 1.262791 0.8885714 3.503488 2.496512 2.358140 2.516279 2.851429
Cluster 1 1.262791 1.1511628 3.503488 2.496512 2.358140 2.516279 3.748837
Cluster 2 1.700000 1.7090909 3.843182 3.006818 3.390909 3.040909 3.979545
Cluster 3 2.401429 0.8885714 4.557143 2.540000 3.302857 2.611429 2.851429
Calidad.Producto Numero.Estrellas
1 2.705714 3.891429
11 2.019767 2.288372
Cluster 1 2.019767 2.288372
Cluster 2 2.590909 3.472727
Cluster 3 2.705714 3.891429
radarchart(centros,maxmin=TRUE,axistype=4,axislabcol="slategray4",
centerzero=FALSE,seg=8,cglcol="gray67",
pcol=c("#00AFBB", "#E7B800", "#fc078a"),
plty=1,
plwd=5,
title="Comparacion de clusteres")
legenda <-legend(1.5,1, legend=c("Cluster 1","Cluster 2","Cluster 3"),
seg.len=-1.4,
title="Clusteres",
pch=21,
bty="n" ,lwd=3, y.intersp=1, horiz=FALSE,
col=c("#00AFBB", "#E7B800", "#fc078a"))
Cluster 1:
Cluster 2:
Cluster 3:
g) Suponga que se trabajaron los datos con 3 clústeres, como se muestra en el plano principal siguiente:
Partiendo del hecho de que todos los individuos compraron, ya sea el mismo producto o similares, pero, cada uno tuvo una experiencia de compra diferente que pudo ser mejor o peor en los diferentes rubros de la evaluación,
• ¿Qué productos recomendarÃa a Salome?
Respuesta
• ¿Qué productos recomendarÃa a Stephania?
Respuesta
• ¿Qué productos recomendarÃa a Lydia?
Respuesta
Es decir, los mismos productos que compró cuál otro cliente.
1. [10 puntos] Considérese tabla datos ConsumoEuropa.csv que contiene una estimación del consumo promedio de proteÃnas, en gramos, por persona y por dÃa, en Europa, datos del año 1981 (Está en el aula virtual con el nombre).
consumo <- read.csv("ConsumoEuropa.csv", sep = ";", dec = ",", header = T,row.names = 1)
head(consumo)
CarneAnimal CarneCerdo Huevos Leche CarnePescado Cereales Almidon Semillas Frutas
Albania 10.1 1.4 0.5 8.9 0.2 42.3 0.6 5.5 1.7
Austria 8.9 14.0 4.3 19.9 2.1 28.0 3.6 1.3 4.3
Belgica 13.5 9.3 4.1 17.5 4.5 26.6 5.7 2.1 4.0
Bulgaria 7.8 6.0 1.6 8.3 1.2 56.7 1.1 3.7 4.2
Checoslovaquia 9.7 11.4 2.8 12.5 2.0 34.3 5.0 1.1 4.0
Dinamarca 10.6 10.8 3.7 25.0 9.9 21.9 4.8 0.7 2.4
a. Usando FactoMineR efectúe un ACP para esta tabla de datos.
pca_consumo <- PCA(consumo, scale.unit=TRUE, ncp=5, graph = FALSE)
b. Grafique el plano principal y el cÃrculo de correlaciones, luego compare este Plano Principal con el mapa de Europa ¿Qué conclusiones puede sacar?
Considere que podrÃa recortar alguno de estos gráficos, hacer rotaciones y es necesario buscar un mapa de Europa, de preferencia un mapa polÃtico.
plot(pca_consumo, axes=c(1, 2), choix="ind", col.ind="#00AFBB",new.plot=TRUE)
plot(pca_consumo, axes=c(1, 2), choix="var", col.var="#fc078a",new.plot=TRUE)